/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CapaDatos;

import CapaSeguridad.CodigoErrorEnum;
import CapaSeguridad.GuateBayException;
import java.sql.ResultSet;
import java.util.LinkedList;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 *
 * @author fernando
 */
public class Usuario_DAO implements DAO {

    private String sentenciaSQL;
    private int value = -1;
    ConexionDB conexion;
    LinkedList<Usuario_POJO> listaDetalle = new LinkedList<Usuario_POJO>();
    Usuario_POJO retorno = new Usuario_POJO();
    ResultSet resultado;
    private String temp;
    
    public Usuario_DAO() {
        conexion = new ConexionDB();
    }

    public LinkedList< Usuario_POJO> obtenerReg(int id) throws SQLException {
        temp = "select idusuario,nombre,nickname,email,cuentaactiva,idrolusuario,contrasena from Usuario where idusuario=?";
        
        PreparedStatement ps=conexion.getConnection().prepareStatement(temp);
        ps.setInt(1, id);
                
        //sentenciaSQL = "select idusuario,nombre,nickname,email,cuentaactiva,idrolusuario,contrasena from Usuario where idusuario=" + id;

        try {

            conexion.abrirConexion();
            //resultado = conexion.getResultSet(sentenciaSQL);
            resultado = ps.executeQuery();
            
            if (resultado.next()) {

                retorno.setIdUsuario(Integer.parseInt(resultado.getString("idusuario")));
                retorno.setNombre(resultado.getString("nombre"));
                retorno.setNickname(resultado.getString("nickname"));
                retorno.setEmail(resultado.getString("email"));
                retorno.setCuentaActiva(resultado.getString("cuentaactiva"));
                retorno.setIdRolUsuario(resultado.getString("idrolusuario"));
                retorno.setContraseña(resultado.getString("password"));


                listaDetalle.add(retorno);
            }
            ps.close();
            conexion.cerrarConexion();

        } catch (Exception ex) {
            System.out.println("error " + ex);
        }

        return listaDetalle;
    }
		
	/**
     * Metodo que recibe el nickname y password de un usuario y retorna su identificador.
     * @param nickname apodo o nombre corto del usuario
     * @param password password del usuario
     * @return identificador del usuario almacenado en la bd
     */
	public int obtenerIdUsuario(String nickname, String password) throws GuateBayException{
        sentenciaSQL = "SELECT idusuario FROM Usuario WHERE nickname='" + nickname+"' AND password = '"+password+"'";
        int aRegresar = -1;
        try {

            conexion.abrirConexion();
            resultado = conexion.getResultSet(sentenciaSQL);

            if (resultado.next()) {
                aRegresar = resultado.getInt("idUsuario");
            }
            conexion.cerrarConexion();

        } catch (Exception ex) {
            System.out.println("error " + ex);
            throw new GuateBayException(ex,"Error en transacción",CodigoErrorEnum.ErrorDeSQL);            
        }

        return aRegresar;
    }

    public int guardarReg(String nombre, String nickname, String email, String contraseña, String cuentaactiva, int idrolusuario) throws GuateBayException {
        conexion.abrirConexion();

        sentenciaSQL = "INSERT INTO usuario (nombre,nickname,email,password,cuentaactiva,idrolusuario) VALUES ('"
                + nombre + "','" + nickname + "','" + email + "','" + contraseña + "'," + cuentaactiva + "," + idrolusuario + ")";

          System.out.println(sentenciaSQL);
        try {
            value = conexion.executeQuery(sentenciaSQL);
            System.out.println("");


        } catch (Exception ex) {
            System.out.println("error " + ex);
            throw new GuateBayException(ex,"Error en transacción",CodigoErrorEnum.ErrorRegistro);            
        }
        conexion.cerrarConexion();
        return value;
    }

    public int actualizarReg(int idusuario, String nombre, String nickname, String email, String contraseña, String cuentaactiva, int idrolusuario) {


        sentenciaSQL = "UPDATE  usuario   SET  nombre='" + nombre
                + "',nickname='" + nickname + "',email='" + email + "',password='" + contraseña + "',cuentaactiva='" + cuentaactiva + "',idrolusuario='" + idrolusuario + "' where idusuario=" + idusuario;

        // System.out.println(sentenciaSQL);
        try {
            conexion.abrirConexion();
            value = conexion.executeQuery(sentenciaSQL);
            


        } catch (Exception ex) {
            System.out.println("error " + ex);
            value = -1;
            conexion.cerrarConexion();
        }
        conexion.cerrarConexion();
        return value;
        
    }

    @Override
    public int eliminarReg(int id) {

        sentenciaSQL = "DELETE FROM Usuario WHERE idusuario=" + id;

        try {
            conexion.abrirConexion();
            value = conexion.executeQuery(sentenciaSQL);
            conexion.cerrarConexion();


        } catch (Exception ex) {
            System.out.println("error " + ex);
            conexion.cerrarConexion();
            value = -1;
        }
           conexion.cerrarConexion();
        return value;
    }
    
    public ResultSet usuarioMasComprasxanio(int anio){
    sentenciaSQL="select nombre,count(*) as noCompras,date_part('year',fechapago) as ano from pedido join Usuario on (pedido.idusuario=usuario.idusuario) where statuspago='t' and  date_part('year',fechapago) ="+anio+" group by nombre,date_part('year',fechapago) order by noCompras desc limit 1";
        
        //select nombre,count(*) as noCompras,date_part('year',fechapago) as ano from pedido join Usuario on (pedido.idusuario=usuario.idusuario) where statuspago='t' and  date_part('year',fechapago) = 2013 group by nombre,date_part('year',fechapago) order by noCompras desc limit 1;
    try {
            conexion.abrirConexion();
            resultado=conexion.getResultSet(sentenciaSQL);
            value=1;
            System.out.println(sentenciaSQL);
            
            conexion.cerrarConexion();


        } catch (Exception ex) {
            System.out.println("error " + ex);
            conexion.cerrarConexion();
            value = -1;
        }
    return resultado;
    }
	
	
	
	/**
	 * reporta el vendedor con más artículos vendidos en el año (year)
	 * seleccionado
	 */
	public ResultSet repoVendedorMasVentas(String year) {
		sentenciaSQL = "SELECT usuario.nombre, sum(detalle.cantidad) articulos "
				+ "FROM pedido, usuario, detalle, articulo "
				+ "WHERE detalle.idarticulo=articulo.idarticulo AND "
				+ "articulo.idusuario = usuario.idusuario AND pedido.idpedido = detalle.idpedido AND "
				+ "pedido.fechaingreso between '01/01/" + year + "' AND '31/12/" + year + "' "
				+ "GROUP BY usuario.idusuario having sum(detalle.cantidad)=( "
				+ "SELECT max(total) FROM( SELECT sum(detalle.cantidad) total "
				+ "FROM pedido, usuario, detalle, articulo "
				+ "WHERE detalle.idarticulo=articulo.idarticulo AND "
				+ "articulo.idusuario = usuario.idusuario AND "
				+ "pedido.idpedido = detalle.idpedido AND "
				+ "pedido.fechaingreso between '01/01/" + year + "' AND '31/12/" + year + "' "
				+ "GROUP BY usuario.idusuario) tot); ";
		try {
			conexion.abrirConexion();
			resultado = conexion.getResultSet(sentenciaSQL);
			conexion.cerrarConexion();
			return resultado;
		} catch (Exception ex) {
			//Error lanzado
			System.out.println("Error " + ex);
			return null;
		}
	}
}
